#include "FileSystem.h"

#include <sstream>
#include <cstdio>
#include <sys/stat.h>


bool FileSystem::createFolder(std::string nomCarpeta){

	if (existeCarpeta(nomCarpeta)) return true;

	int stat = mkdir(nomCarpeta.c_str(), 0777);

	if (stat == 0) return true;
	else return false;
}

bool FileSystem::existeCarpeta(std::string nomCarpeta){
	struct stat myStat;
	if ( stat(nomCarpeta.c_str(), &myStat) == 0 && S_ISDIR(myStat.st_mode) ) {
		// Existe la carpeta
		return true;
	}

	// No existe la carpeta
	return false;
}


bool FileSystem::crearCarpetaFusion(int nivel){

	std::string nom = getNombreEtapa(1);
	for (int i = 1; i <= nivel; i++){

		if (! existeCarpeta(nom)){
			bool ok = createFolder(nom);
			if (!ok) return false;
		}

		nom += "/" + getNombreEtapa(i+1);
	}

	return true;
}


bool FileSystem::existeCarpetaFusion(int nivel){

	std::string nom = getNombreEtapa(1);
	for (int i = 1; i <= nivel; i++){

		if (! existeCarpeta(nom)){
			return false;
		}

		nom += "/" + getNombreEtapa(i+1);
	}

	return true;
}


std::string FileSystem::getNombreFusion(int orden, int etapa){
	std::stringstream ss;

	if (etapa > 0){
		// Si la etapa es mayor a cero, hay que devolver el nombre con el path
		// al sub-directorio de la etapa indicada
		std::string s = "";
		do {
			// Va armando el path de atras para adelante
			s = getNombreEtapa(etapa) + "/" + s;
			etapa--;

		} while (etapa > 0);

		ss << s;
	}

	ss << "fusion_" << orden << ".bin";

	return ss.str();
}

std::string FileSystem::getNombreParticion(int orden){
	std::stringstream ss;
	ss << "particion_" << orden << ".bin";

	return ss.str();
}


std::string FileSystem::getNombreEtapa(int orden){
	std::stringstream ss;
	ss << "etapa_" << orden;

	return ss.str();
}



std::string FileSystem::getNombreArchivoTemporal(){
	char nomSalida[L_tmpnam] = {0};
	std::tmpnam(nomSalida);

	return std::string(nomSalida);
}


void FileSystem::eliminarArchivo(std::string nomArch){
	std::remove(nomArch.c_str());
}



